package com.common.filter;

import org.springframework.core.annotation.Order;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 登陆过滤器
 *
 * @author gm
 * @date 2020/6/8
 */
@WebFilter("/*")
@Order(1)
public class LoginFilter implements Filter {

    /**
     * 实例化一个静态的集合(这里可以改用map集合，提高性能，每次过滤可以不用for匹配)
     *
     * @author gm
     * @date 2020/6/8
     */
    private static List<String> urls = new ArrayList<>();

    //静态代码块中向集合中存放所有可以放行的请求或网页地址（不用账号密码即可访问）
    static {
        /* 放行静态资源 */
        urls.add("/ckeditor2");
        urls.add("/css");
        urls.add("/font-awesome-4.7.0");
        urls.add("/image");
        urls.add("/js");
       // urls.add("/main");
        urls.add("/favicon.ico");
        urls.add("/login.html");

        /* 放行的url */
        //登陆相关
        urls.add("/login");
        urls.add("/logout");
        urls.add("/register");
        //设备类别
        urls.add("/category/getCategory");
        //评论
        urls.add("/comment/getComment");
        urls.add("/comment/getCommentForPage");
        urls.add("/comment/saveComment");
        //设备信息
        urls.add("/device/getDevice");
        urls.add("/device/getDevicePage");
        urls.add("/device/getPicture");
        urls.add("/device/getDeviceLikeName");
        //首页轮播图
        urls.add("/index/getPicture");
        //行业资讯
        urls.add("/information/getInformation");
        urls.add("/information/getInformationForPage");
        urls.add("/information/getInformationLikeTitle");
        //图片
        urls.add("/1");
        urls.add("/2");
        urls.add("/3");
        urls.add("/4");
    }

    /**
     * 拦截请求，看看用户是否登陆，如果没有登陆，
     * 则跳转回登录页面，否则就放行
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        //注意：ServletRequest是HttpServletRequest父接口,因此需要强转
        //同样，ServletResponse是HttpServletResponse父接口,因此需要强转

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        //得到当前页面所在目录下全名称
        String urlPattern = req.getServletPath();
        //得到页面所在服务器的绝对路径
        String path = req.getRequestURI();
        for (String url : urls) {
            if (url.equals(urlPattern) || path.contains(url)) {
                chain.doFilter(request, response);
                //防止重复响应
                return;
            }
        }
        //如果person为null，表示没有登录
        if (req.getSession().getAttribute("username") == null) {
            res.sendRedirect("/login.html");
        } else {
            //放行
            chain.doFilter(request, response);
        }
    }

    @Override
    public void init(FilterConfig arg0) {
        // TODO Auto-generated method stub
        System.out.println("登陆过滤器初始化！！！！！！！");
    }

    @Override
    public void destroy() {
        // TODO Auto-generated method stub
    }

}

